package model

import (
	// 官方提供的接口文档，我们通过sql 包中的结构体函数
	"database/sql"
	"errors"
	"fmt"
	"sync"

	// 我们只是要使用mysql 这个报下的init函数，所以前面用匿名导包方式，本文件并不会去调用mysql下的任何内容方法
	"github.com/cht9862/mango/myloger"
	_ "github.com/go-sql-driver/mysql"
)


/*
得到一个数据库句柄
	1. 声明一个*sql.DB 类型的变量接受，sql.Open后的参数，err error 类型的变量判断句柄是否正常
	2. 注意：这里的变量要大写，因为其他包中要使用到Db 和Err 这两个变量
	** 本文件的作用：
		用于获取到一个数据库句柄，将句柄返回给导入本包的文件使用
*/

var logFmt = myloger.NewLog()
var my = MysqlOrm{}
var mutex = sync.RWMutex{}


var (
	Db *sql.DB
	Err error
)

func init(){
	Db, Err = sql.Open("mysql","root:a@199862@tcp(localhost:3306)/problem")
	if Err != nil {
		logFmt.Error("-- > 数据库连接失败")
	}
}

type userRow struct {
	Id int
	Name string
	Passwd string
	Phone int
}


type MysqlOrm struct {

}

func (m MysqlOrm)AddProblems(string) error{
	return nil
}


func (m MysqlOrm)DelProblems(string) error{
	return nil
}

func (m MysqlOrm)GetProblems(string) (map[string]string,error){
	m1 := make(map[string]string)

	return m1,nil

}

func (m MysqlOrm)SetProblems(Questions string,Answer string) error{
	return nil
}


func (m MysqlOrm)SetUser(name1, password, oldName string, phone int) error {

	u := userRow{}

	mutex.RLock()
	sqlStr := "select * from user where name = ?"

	row := Db.QueryRow(sqlStr, oldName)
	err := row.Scan(&u.Id,&u.Name,&u.Passwd,&u.Phone)
	mutex.RUnlock()
	logFmt.Info("执行到这里")
	if err != nil {
		str := fmt.Sprintf("-- > 后台获取信息失败 \n实际错误信息：%v",err)
		logFmt.Warning(str)
		err = errors.New(str)
		return err
	}

	mutex.Lock()
	sqlStr = "UPDATE user SET name=?,passwd=?,phone=? WHERE name=?"
	_, err = Db.Exec(sqlStr,name1,password,phone,oldName)
	mutex.Unlock()
	if err != nil {
		str := fmt.Sprintf("-- > 修改用户信息失败 \n实际错误信息：%v",err)
		logFmt.Warning(str)
		err = errors.New(str)
		return err
	}
	logFmt.Info("执行完成")
	return nil
}



func (m MysqlOrm)GetUser(name, password string) error{
	u := userRow{}

	mutex.RLock()
	sqlStr := "select * from user where name = ?"

	row := Db.QueryRow(sqlStr, name)
	err := row.Scan(&u.Id,&u.Name,&u.Passwd,&u.Phone)
	mutex.RUnlock()
	fmt.Println(u)
	if err != nil {
		str := fmt.Sprintf("-- > 后台获取信息失败 \n实际错误信息：%v",err)
		logFmt.Warning(str)
		err = errors.New(str)
		return err
	}
	if u.Name != name {
		str := fmt.Sprintf("-- > 账号密码不正确 ")
		logFmt.Warning(str)
		err = errors.New(str)
		return err
	}

	if u.Passwd != password {
		str := fmt.Sprintf("-- > 账号密码不正确 ")
		logFmt.Warning(str)
		err = errors.New(str)
		return err
	}
	if len(u.Name) <1 {
		str := fmt.Sprintf("-- > 账号密码不正确 ")
		logFmt.Warning(str)
		err = errors.New(str)
		return err
	}
	if len(u.Passwd) <1 {
		str := fmt.Sprintf("-- > 账号密码不正确 ")
		logFmt.Warning(str)
		err = errors.New(str)
		return err
	}
	return nil
}


func (m MysqlOrm)AddUser(username ,password string, iphone int) error{
	sqlStr := "insert into user (name,passwd,phone) values(?,?,?)"
	mutex.Lock()
	defer mutex.Unlock()

	insert, err := Db.Prepare(sqlStr)
	defer insert.Close()
	if err != nil {
		str := fmt.Sprintf("-- > 数据库信息填写错误 \n实际错误信息：%v",err)
		logFmt.Warning(str)
		err = errors.New(str)
		return err
	}
	_, err = insert.Exec(username,password,iphone)
	if err != nil {
		str := fmt.Sprintf("-- > 添加用户失败 \n实际错误信息：%v",err)
		logFmt.Warning(str)
		err = errors.New(str)
		return err
	}


	return nil
}


